import { JEventEmit } from '../components/util/jEventEmit';
import { UITag, UITagExtends } from './uiTag';

export class UIEvents {
    events: { [propName: string]: JEventEmit } = {}

    /**
     * 订阅事件
     * @param id 事件对应的id
     * @param func 事件用到的方法
     * @param sortID 排序,影响触发先后顺序,默认1
     */
    addSubcribe<T extends keyof UITagExtends, K extends UITagExtends[T]>(id: T, func: (data?: K) => void, sortID?: number) {
        if (!this.events[id]) {
            this.events[id] = new JEventEmit()
        }
        this.events[id].subscribe(func, sortID)
    }

    /**
     * 订阅最后触发的事件,会比subscribe要晚
     * @param id 事件对应的id
     * @param func 事件用到的方法
     */
    addFinalySubsribe<T extends keyof UITagExtends, K extends UITagExtends[T]>(id: T, func: (data?: K) => void) {
        if (!this.events[id]) {
            this.events[id] = new JEventEmit()
        }
        this.events[id].finalySubcribe(func)
    }

    /**
     * 订阅事件(强制类型版本)
     * @param id 事件对应的id
     * @param func 事件用到的方法
     */
    addStrongeSubcribe<T extends keyof UITag, K extends UITag[T]>(id: T, func: (data?: K) => void) {
        this.addSubcribe(id, func)
    }

    /**
     * 触发事件
     * @param id 事件对应的id
     * @param data 事件可能需要用到的数据
     * @param isAsync 是否同步，默认否
     */
    async emitEvent<T extends keyof UITagExtends, K extends UITagExtends[T]>(id: T, data?: K, isAsync: boolean = false) {
        if (!this.events[id]) {
            console.log(`暂无 ${id} 的事件`)
            return false
        }
        if (!isAsync)
            return this.events[id].emit(data, () => {
                console.error(`错误事件为:${id}`)
            })
        await this.events[id].asyncEmit(data)
        return;
    }

    /**
     * 触发事件(强制类型版本)
     * @param id 事件对应的id
     * @param data 事件可能需要用到的数据
     */
    async emitStrongEvent<T extends keyof UITag, K extends UITag[T]>(id: T, data?: K, isAsync: boolean = false) {
        return await this.emitEvent(id, data, isAsync)
    }

    //btnclick: JEventEmit<any>  = new JEventEmit()
    //通知
    showMsg: JEventEmit<string> = new JEventEmit()
}

export const ui = new UIEvents()
